# -*- coding: utf-8 -*-
'''
Created on 8/05/2012

@author: EdwarC
'''
from django.core.management import call_command
from django.core.mail import send_mail
from django.core.context_processors import csrf
from django.contrib.sessions.models import Session
from django.shortcuts import render_to_response, redirect
from django.template import RequestContext, loader
from django.http import HttpResponse
from django.views.static import Context, HttpResponseRedirect                       # incorporo para poder acceder a archivos estaticos
from django.conf import settings
from django.contrib import auth
from django.contrib.auth import authenticate, login                                   
from django.contrib.auth.models import Group, User
from django.contrib.auth.decorators import login_required                           # permite usar @login_requerid
from datetime import date, timedelta
import calendar
import user
from app.models import TipoDocumento, Estudiante, Facultad, Periodo, Matricula,\
    Configuracion, Pagos, LogMensajes, Notificaciones, Concepto,\
    MovimientoConcepto, Movimiento
from django.db.models import Q
import csv
import urllib2
from urllib2 import URLError, HTTPError
from django.utils.datetime_safe import datetime
from django.contrib.admin.models import LogEntry, ADDITION
from django.contrib.contenttypes.models import ContentType
from django.utils.encoding import force_unicode
from decimal import Decimal
from django.db.models.aggregates import Sum, Max
from types import NoneType
#from django.utils.datetime_safe import datetime

def int2word(n):
    """
    convert an integer number n into a string of english words
    """
    # break the number into groups of 3 digits using slicing
    # each group representing hundred, thousand, million, billion, ...
    n3 = []
    r1 = ""
    # create numeric string
    ns = str(n)
    for k in range(3, 33, 3):
        r = ns[-k:]
        q = len(ns) - k
        # break if end of ns has been reached
        if q < -2:
            break
        else:
            if  q >= 0:
                n3.append(int(r[:3]))
            elif q >= -1:
                n3.append(int(r[:2]))
            elif q >= -2:
                n3.append(int(r[:1]))
        r1 = r
    
    #print n3  # test
    
    # break each group of 3 digits into
    # ones, tens/twenties, hundreds
    # and form a string
    nw = ""
    for i, x in enumerate(n3):
        b1 = x % 10
        b2 = (x % 100)//10
        b3 = (x % 1000)//100
        #print b1, b2, b3  # test
        if x == 0:
            continue  # skip
        else:
            t = thousands[i]
        if b2 == 0:
            nw = ones[b1] + t + nw
        elif b2 == 1:
            nw = tens[b1] + t + nw
        elif b2 > 1:
            nw = twenties[b2] + ones[b1] + t + nw
        if b3 > 0:
            nw = ones[b3] + "hundred " + nw
    return nw
############# globals ################
ones = ["", "un ","dos ","tres ","cuatro ", "cinco ",
    "seis ","siete ","ocho ","nueve "]
tens = ["diez ","once ","doce ","trece ", "catorce ",
    "quince ","dieciséis ","diecisiete ","dieciocho ","diecinueve "]
twenties = ["","","veinte ","treinta ","cuarenta ",
    "cincuenta ","sesenta ","setenta ","ochenta ","noventa "]
thousands = ["","mil ","millón ", "billión ", "trillión ",
    "cuadrillión ", "quintillón ", "sextillión ", "septillión ","octillion ",
    "nonillion ", "decillion ", "undecillion ", "duodecillion ", "tredecillion ",
    "quattuordecillion ", "sexdecillion ", "septendecillion ", "octodecillion ",
    "novemdecillion ", "vigintillion "]

def redireccionar(plantilla, solicitud, datos):
    variables = {
        'user': solicitud.user, 
        'titulo': 'Cartera',
        'saludo': '',
        'titulo_pagina': u"Cartera",
        'path': settings.MEDIA_URL,
    }    
    llaves = datos.keys()
    for indice in range(0,len(llaves)):
        variables[llaves[indice]] = datos[llaves[indice]]
    variables =  Context(variables)
    return render_to_response(plantilla, variables, context_instance=RequestContext(solicitud))

def indice(solicitud):
#    try:
    if(solicitud.session.session_key):
        session = Session.objects.get(session_key=solicitud.session.session_key)
        uid = session.get_decoded().get('_auth_user_id')
        datos = {}
        arreglo = ""
        texto = ""
        dias = 30
        configuracion = Configuracion.objects.filter(usuario_id=uid)
        if len(configuracion)>0:
            configuracion = Configuracion.objects.get(usuario_id=uid)
#            dias = configuracion.email_moroso
            mensajes = LogMensajes.objects.filter(configuracion_id = configuracion.id).order_by('-fecha')
            
            fecha = date.today()
            while dias>0:
                total = 0
                fecha_consulta = fecha - timedelta(days=dias)
                pagos = Pagos.objects.filter(fecha__lte=fecha_consulta).aggregate(sum_valor=Sum('valor'))
                if pagos['sum_valor']!=None:
                    valor = pagos['sum_valor']
                else:
                    valor = 0
                
                pagos = Pagos.objects.filter(fecha_pago__lte=fecha_consulta).aggregate(sum_pagado=Sum('pagado'))
                if pagos['sum_pagado']!=None:
                    pagado = pagos['sum_pagado']
                else:
                    pagado = 0
                    
                total = valor - pagado
                texto = "%s ********** %s total: %s" %(texto, fecha_consulta, total)
                arreglo = "%s[%s, %s]," %(arreglo, fecha_consulta.strftime("%d"), total)
                dias = dias-1
            datos = {'Mensajes': mensajes, 'arreglo':arreglo, 'texto':texto}
    
        return redireccionar('index.html', solicitud, datos)
    else:
        return redireccionar('index.html', solicitud, {})
#    except:
#        return redireccionar('index.html', solicitud, {})
    
def recuperarContrasena(solicitud):
    datos = {}
    try:
        if solicitud.method == 'POST':
            usuario = solicitud.POST.get('email')
            mi_usuario = User.objects.filter(username = usuario)
            if mi_usuario:
                contrasena = User.objects.make_random_password(length=10, allowed_chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789')
                user = User.objects.get(username__exact = usuario)
                user.set_password(contrasena)
                texto = "%s %s." %("Se ha restituido su contraseña de acceso a Cartera. La nueva contraseña es: ", contrasena)
                user.save()
                send_mail('Nueva contraseña de acceso a Cartera', texto, 'admin@arawak.com.co', [user.email], fail_silently=False)
                datos['msg_error'] = 'Se ha enviado un mensaje a su cuenta de correo electrónico.'
            else:
                datos['msg_error'] = 'El usuario no esta registrado en el sistema.'
            
    except:
        datos['msg_error'] = 'Se ha producido un error enviando el correo electronico. '
    return redireccionar('index.html', solicitud, datos)
    
    
def mylogin(solicitud):
    datos = {}
    if solicitud.method == 'POST':
        username = solicitud.POST['usuario']
        password = solicitud.POST['contrasena']
        user = authenticate(username=username, password=password)
        if user is None:
            datos['msg_error'] = 'Acceso denegado.'
            return redireccionar('index.html', solicitud, datos)
        else:
            configuracion = Configuracion.objects.filter(usuario_id = user.id)
            if len(configuracion)>0:
                if user.is_active:
                    login(solicitud, user)
                    configuracion = Configuracion.objects.get(usuario_id = user.id)
                    solicitud.session['config'] = configuracion
                    solicitud.session['config_id'] = configuracion.id
                    return HttpResponseRedirect('/')
                else:
                    datos['msg_error'] = 'El usuario no se encuentra activo.'
                    return redireccionar('index.html', solicitud, datos)
            else:
                datos['msg_error'] = 'El usuario no cuenta con datos de institución en el sistema. Contáctese con el administrador'
                return redireccionar('index.html', solicitud, datos)

def mylogout(solicitud):
    if 'grupoUsuarioId' in solicitud.session:
        del solicitud.session['grupoUsuarioId']
    if 'msg_error' in solicitud.session:
        del solicitud.session['msg_error']
    auth.logout(solicitud)    
    return HttpResponseRedirect("/")


#===============================================================================
#  VISTA ESTUDIANTES
#===============================================================================

@login_required
def estudiantes(solicitud, estudiante_id="0"):
    config_id = solicitud.session['config_id']
    
    tipoDocumento = TipoDocumento.objects.all()
    periodos = Periodo.objects.filter(configuracion_id = config_id).order_by('-fecha_inicio')
    facultades = Facultad.objects.filter(configuracion_id = config_id)
    
    estudiante = {}
    matricula = {}
    if estudiante_id != "0":
        estudiante = Estudiante.objects.filter(configuracion_id=config_id, id = estudiante_id)
        if len(estudiante)>0:
            estudiante = Estudiante.objects.get(configuracion_id=config_id, id = estudiante_id)
            matricula = Matricula.objects.filter(estudiante_id = estudiante_id)
            if len(matricula)>0:
                matricula = Matricula.objects.filter(estudiante_id = estudiante_id)
        texto = estudiante_id
    else:
        texto = estudiante_id 
    datos = {'tipoDocumento': tipoDocumento, 'estudiante':estudiante, 'matricula':matricula, 'texto':texto,
             'Periodos':periodos, 'Facultades':facultades}
    return datos
    

@login_required
def estudiantesNuevo(solicitud, estudiante_id="0"):
    datos = estudiantes(solicitud, estudiante_id)
    return redireccionar('cartera/estudiantes.html', solicitud, datos)

@login_required
def estudiantesEditarMatricula(solicitud):
    config_id = solicitud.session['config_id']
    c = {}
    matricula = {}
    semestres = []
    pagos = []
    matricula_id = 0
    
    if solicitud.method == 'POST':
        texto = ""
        c.update(csrf(solicitud.POST.get('csrfmiddlewaretoken')))       
        matricula_id = solicitud.POST.get('matricula_id', 0)
        if matricula_id != "0":
            matricula = Matricula.objects.get(id = matricula_id)
        else:
            texto = matricula_id
    else:
        texto = solicitud.method
    
    texto = matricula_id
    periodos = Periodo.objects.filter(configuracion_id = config_id).order_by('-fecha_inicio')
    Pago = Pagos.objects.filter(matricula_id = matricula_id, cuota_id = 0)
    for pago in Pago:
        pagos.append({'pago':pago})
        break
    
    facultades = Facultad.objects.filter(configuracion_id = config_id)
    facultad = Facultad.objects.filter(configuracion_id=config_id, id=matricula.facultad_id)
    for f in facultad:
        tmp_f = Facultad.objects.get(configuracion_id=config_id, id=f.id)
        
        for indice in range(0,tmp_f.semestres):
            semestres.append({'id':indice+1})  
    datos = {'matricula':matricula, 'texto':texto, 'Periodos':periodos, 'Facultades':facultades, 'semestres':semestres, 'Pagos':pagos}
    
    return redireccionar('cartera/estudiantes_editar_matricula.html', solicitud, datos)

@login_required
def estudiantesMatriculasGuardar(solicitud):
    matricula = {}
    if solicitud.method == 'POST':
        c = {}
        estudiantes = {}
        texto = ""
        dias = 0
        matricula_id = 0
        saldo_credito = 0
        c.update(csrf(solicitud.POST.get('csrfmiddlewaretoken')))
        for atributo, file in solicitud.POST.iteritems():
            if atributo == 'matricula_id':
                matricula_id = solicitud.POST.get('matricula_id')
        
        estudiante_id = solicitud.POST.get('estudiante_id')
        periodo = solicitud.POST.get('periodo')
        semestre = solicitud.POST.get('semestre')
        facultad = solicitud.POST.get('facultad')
        credito = solicitud.POST.get('credito',0)
        cuota_inicial = solicitud.POST.get('cuota_inicial',0)
        descuento = solicitud.POST.get('descuento',0)
        intereses = solicitud.POST.get('intereses',0)
        cuotas = solicitud.POST.get('cuotas',0)
        
        tmp_inicio = solicitud.POST.get('fecha_inicial')
        if tmp_inicio != '':
            fecha_inicial = date(int(tmp_inicio[6:10]), int(tmp_inicio[0:2]), int(tmp_inicio[3:5]))
        else:
            fecha_inicial = date.today()    
        texto = "%s" %(tmp_inicio)
        credito = credito.replace(u",", ".")
        cuota_inicial = cuota_inicial.replace(u",", ".")
        descuento = descuento.replace(u",", ".")
        intereses = intereses.replace(u",", ".")
        
        if estudiante_id != "0":
            estudiantes = Estudiante.objects.get(id = estudiante_id)
            periodos = Periodo.objects.filter(id = periodo)
            if len(periodos)>0:
                periodos = Periodo.objects.get(id = periodo)
            
            fecha = date.today()
            if periodos.fecha_inicio != 0:
                fecha = periodos.fecha_inicio
                corte = periodos.fecha_fin - periodos.fecha_inicio
                dias = corte.days
            
            if matricula_id == 0:
                texto = "Nuevo"
                saldo_credito = float(credito) - float(descuento) + float(intereses) 
                matricula = Matricula(estudiante_id=estudiante_id, facultad_id=facultad, periodo_id=periodo, semestre=semestre,
                                        fecha=fecha, valor_credito=credito, cuotas=cuotas, intereses=intereses, 
                                        valor_descuento=descuento, saldo=saldo_credito, cuotas_pendientes=cuotas)
            else:
                matricula = Matricula.objects.get(id=matricula_id)
                matricula.facultad_id = facultad
                matricula.periodo_id = periodo
                matricula.semestre = semestre
                matricula.fecha = fecha
                matricula.valor_credito = credito
                matricula.cuotas = cuotas
                matricula.intereses = intereses
                matricula.valor_descuento = descuento
                saldo_credito = float(credito) - float(descuento) + float(intereses)
                
                matricula.saldo = saldo_credito
                matricula.cuotas_pendientes = cuotas
                pago = Pagos.objects.filter(matricula_id = matricula_id)
                pago.delete()
                texto = matricula_id
            matricula.save()
            
            LogEntry.objects.log_action(
                            user_id = solicitud.user.pk, 
                            content_type_id = ContentType.objects.get_for_model(matricula).pk, 
                            object_id = matricula.pk, 
                            object_repr = force_unicode(matricula), 
                            action_flag = ADDITION,
                            change_message = "%s %s" %("Modificacion matricula. Credito = ", credito)
                            )

            i = 0
            suma_cuotas = 0
            fecha_cuota = periodos.fecha_inicio
            
            pago = Pagos(matricula_id = matricula.id, cuota_id = 0, fecha = fecha_inicial, valor = cuota_inicial, observacion = "")
            pago.save()
#            texto = "%s, %s, %s" %(matricula.id, fecha_inicial, cuota_inicial)
            while i<int(cuotas):
                i = i + 1
                if periodos.corte_fin_mes==1:
                    firstweekday,days = calendar.monthrange(fecha_cuota.year, fecha_cuota.month)
                    if i==0:
                        fecha_cuota = date(fecha_cuota.year, fecha_cuota.month, days)
                    else:
                        tmp_cuota = fecha_cuota + timedelta(days=1)
                        firstweekday,days = calendar.monthrange(tmp_cuota.year, tmp_cuota.month)
                        fecha_cuota = date(tmp_cuota.year, tmp_cuota.month, days)
                else:
                    dias_cuota = dias//int(cuotas)
                    fecha_cuota = fecha_cuota + timedelta(days=dias_cuota)
                if i==int(cuotas):
                    valor_cuota = float(saldo_credito) - float(cuota_inicial) - suma_cuotas
                else:
                    valor_cuota = (float(saldo_credito) - float(cuota_inicial))/int(cuotas)
                    suma_cuotas = suma_cuotas + valor_cuota
                
                pago = Pagos(matricula_id = matricula.id, cuota_id = i, fecha = fecha_cuota, valor = valor_cuota, observacion = "")
                pago.save()
                
            matricula = Matricula.objects.filter(estudiante_id = estudiante_id).order_by('-fecha', 'facultad', 'semestre')
    datos = {'matricula':matricula, 'estudiante':estudiantes, 'texto':texto}
    
    return redireccionar('cartera/estudiantes_matriculas.html', solicitud, datos)


@login_required
def estudiantesMatriculas(solicitud):
    matricula = {}
    if solicitud.method == 'POST':
        c = {}
        texto = ""
        c.update(csrf(solicitud.POST.get('csrfmiddlewaretoken')))
               
        estudiante_id = solicitud.POST.get('estudiante_id')
        if estudiante_id != "0":
            estudiantes = Estudiante.objects.get(id = estudiante_id)
            matricula = Matricula.objects.filter(estudiante_id = estudiante_id)
            texto = estudiante_id
        else:
            texto = estudiante_id
    else:
        texto = solicitud.method
    
    datos = {'matricula':matricula, 'texto':texto, 'estudiante':estudiantes}
    return redireccionar('cartera/estudiantes_matriculas.html', solicitud, datos)
    
    
@login_required
def estudiantesBorrar(solicitud):
    texto = "Antes de post"
    if solicitud.POST:
        texto = "En post"
        config_id = solicitud.session['config_id']
#        try:
        estudiantes = Estudiante.objects.filter(configuracion_id=config_id)
        for estudiante in estudiantes:
            chk = u"%s_%s" %('chk', estudiante.id)
            estudiante_seleccionado = solicitud.POST.get(chk, 0)
            texto = "%s matricula_id: %s chk: %s" %(texto, estudiante.id, chk)
            if estudiante_seleccionado != 0:
                matriculas = Matricula.objects.filter(estudiante_id=estudiante.id)
                if len(matriculas)<1:
                    tmp_matricula = Estudiante.objects.get(id = estudiante.id)
                    tmp_matricula.delete()
    return HttpResponseRedirect("/cartera/buscar/")


@login_required
def estudiantesMatriculasBorrar(solicitud):
    texto = "Antes de post"
    if solicitud.POST:
        texto = "En post"
        config_id = solicitud.session['config_id']
        est_id = solicitud.POST.get('id_est', 0)
#        try:
        matriculas = Matricula.objects.filter(estudiante_id=est_id)
        for matricula in matriculas:
            chk = u"%s_%s" %('chk', matricula.id)
            matricula_seleccionada = solicitud.POST.get(chk, 0)
            texto = "%s matricula_id: %s chk: %s" %(texto, matricula.id, chk)
            if matricula_seleccionada != 0:
                pagos = Pagos.objects.filter(matricula_id=matricula.id)
                pagos.delete()
                matricula.delete()
    ruta = "/cartera/buscar/%s" %(est_id)
    return HttpResponseRedirect(ruta)


@login_required
def estudiantesHistorialImprimir(solicitud):
    matricula = {}
    if solicitud.method == 'POST':
        c = {}
        consolidado_matriculas = {}
        texto = ""
        estudiante = {}
        c.update(csrf(solicitud.POST.get('csrfmiddlewaretoken')))
               
        estudiante_id = solicitud.POST.get('id_est')
        if estudiante_id != "0":
            estudiante = Estudiante.objects.get(id = estudiante_id)
            matriculas = Matricula.objects.filter(estudiante_id = estudiante_id)
            for mat in matriculas:
                pagos = Pagos.objects.filter(matricula_id = mat.id)
                consolidado_matriculas[mat] = {'matricula':mat, 'pagos':pagos}
            texto = estudiante_id
        else:
            texto = estudiante_id
    else:
        texto = solicitud.method
    
    datos = {'Estudiante':estudiante, 'matriculas':consolidado_matriculas, 'texto':texto}
    return redireccionar('cartera/estudiantes_historial_imprimir.html', solicitud, datos)


@login_required
def estudiantesMatriculaAcuerdo(solicitud, matricula_id):
    c = {}
    #consolidado_matriculas = {}
    cuota_inicial = 0
    vlr_financiacion = 0
    vlr_saldo = 0
    vlr_contado = 0
    vlr_cuota = 0
    vlr_credito = 0
    
    texto = ""
    c.update(csrf(solicitud.POST.get('csrfmiddlewaretoken')))
        
    matricula = Matricula.objects.get(id = matricula_id)
    
    pagos = Pagos.objects.filter(matricula_id = matricula.id)
    for pago in pagos:
        if pago.cuota_id == 0:
            cuota_inicial = pago.valor
        else:
            vlr_financiacion += pago.valor
            vlr_cuota = pago.valor
    
    vlr_saldo = vlr_financiacion
     
    if matricula.intereses != None:
        vlr_financiacion -= matricula.intereses
    
    if matricula.valor_descuento != None:
        vlr_contado = matricula.valor_credito - matricula.valor_descuento
    else:
        vlr_contado = matricula.valor_credito
        
    vlr_credito = int(matricula.valor_credito)
    texto = int2word(vlr_credito)
    
    datos = {'matricula':matricula, 'pagos':pagos, 'texto':texto, 'vlr_financiacion':vlr_financiacion, 
                'vlr_cuota':vlr_cuota, 'cuota_inicial':cuota_inicial, 'valor_contado':vlr_contado, 'valor_saldo':vlr_saldo}
    return redireccionar('cartera/estudiantes_imprimir_acuerdo.html', solicitud, datos)

@login_required
def estudiantesPazYSalvo(solicitud, matricula_id):
    c = {}
    
    fecha = datetime.now()
    texto = ""
    c.update(csrf(solicitud.POST.get('csrfmiddlewaretoken')))
        
    matricula = Matricula.objects.get(id = matricula_id)
       
    datos = {'matricula':matricula, 'texto':texto, 'fecha':fecha}
    return redireccionar('cartera/estudiantes_imprimir_paz_y_salvo.html', solicitud, datos)

@login_required
def estudiantesCalendario(solicitud):
    matricula = {}
    pagos = {}
    if solicitud.method == 'POST':
        c = {}
        c.update(csrf(solicitud.POST.get('csrfmiddlewaretoken')))       
        matricula_id = solicitud.POST.get('matricula_id')
            
        if matricula_id != "0":
            matricula = Matricula.objects.filter(id = matricula_id)
            if len(matricula)>0:
                pagos = Pagos.objects.filter(matricula_id=matricula_id)
            else:
                pagos = {}
            texto = matricula_id
        else:
            texto = matricula_id
    else:
        texto = solicitud.method
    
    datos = {'pagos':pagos, 'matricula_id':matricula_id, 'texto':len(pagos)}
    
    return redireccionar('cartera/estudiantes_calendario.html', solicitud, datos)


@login_required
def estudiantesCalendarioImprimir(solicitud):
    matricula = {}
    if solicitud.method == 'POST':
        c = {}
        c.update(csrf(solicitud.POST.get('csrfmiddlewaretoken')))
        config_id = solicitud.session['config_id']
        configuracion = Configuracion.objects.get(id = config_id)
        matricula_id = solicitud.POST.get('matricula_id')
            
        if matricula_id != "0":
            matricula = Matricula.objects.filter(id = matricula_id)
            if len(matricula)>0:
                matricula = Matricula.objects.get(id = matricula_id)
                pagos = Pagos.objects.filter(matricula_id=matricula_id)
            else:
                pagos = {}
            texto = matricula_id
        else:
            texto = matricula_id
    else:
        texto = solicitud.method
    
    datos = {'pagos':pagos, 'texto':len(pagos), 'matricula':matricula}
        
    return redireccionar('cartera/estudiantes_calendario_imprimir.html', solicitud, datos)


@login_required
def estudiantesPagar(solicitud):
    pago = {}
    texto = ""
    if solicitud.method == 'POST':
        c = {}
        c.update(csrf(solicitud.POST.get('csrfmiddlewaretoken')))       
        pago_id = solicitud.POST.get('pago_id')
            
        if pago_id != "0":
            pagos = Pagos.objects.filter(id = pago_id)
            if len(pagos)>0:
                pago = Pagos.objects.get(id=pago_id)
            else:
                pago = {}
            texto = pago_id
        else:
            texto = pago_id
    else:
        texto = solicitud.method
    
    datos = {'pagos':pago, 'texto':texto}
    
    return redireccionar('cartera/estudiantes_pagar.html', solicitud, datos)


@login_required
def estudiantesPagoGuardar(solicitud):
    texto = ""
    if solicitud.POST:
        pago_id = solicitud.POST.get('pago_id')
        pagado = solicitud.POST.get('pagado', 0)
        observacion = solicitud.POST.get('pagoobs')
        pagado = pagado.replace(",", ".")
        matricula_id = 0
        saldo = 0
        total_pagos = 0
        credito = 0
        descuento = 0
        intereses = 0           
        
        try:
            if pago_id>=0:
                pagos = Pagos.objects.filter(id = pago_id)
                if len(pagos)>0:
                    pagos = Pagos.objects.get(id = pago_id)
                    matricula_id = pagos.matricula_id
                    pagos.pagado = pagado
                    if (float(pagado)>0):
                        pagos.fecha_pago = date.today()
                    else:
                        pagos.fecha_pago = None
                    pagos.observacion = observacion
                    
                    pagos.save()
                    
                    pagos = Pagos.objects.filter(matricula_id = matricula_id)
                    for pago in pagos:
                        total_pagos = float(total_pagos) + float(pago.pagado)
                    
                    matricula = Matricula.objects.get(id = matricula_id)
                    if matricula.valor_credito != None:
                        credito = matricula.valor_credito
                    if matricula.valor_descuento != None:
                        descuento = matricula.valor_descuento
                    if matricula.intereses != None:
                        intereses = matricula.intereses
                    
                    saldo = float(credito) - float(descuento) + float(intereses) - float(total_pagos)
                    
                    matricula.saldo = saldo
                    matricula.save()
                    
                    texto = matricula_id
                
        except:
#            c = {}
            texto = "Error"
    return HttpResponse(texto)


@login_required
def estudiantesGuardar(solicitud):
    config_id = solicitud.session['config_id']
    
    id_estudiante = solicitud.POST['id_estudiante']
    nombre1 = solicitud.POST['nombre1']
    nombre2 = solicitud.POST['nombre2']
    apellido1 = solicitud.POST['apellido1']
    apellido2 = solicitud.POST['apellido2']
    identificacion = solicitud.POST['documento']
    tipo_documento = solicitud.POST['tipo-documento']
    direccion = solicitud.POST['direccion']
    telefono = solicitud.POST['telefono']
    celular = solicitud.POST['celular']
    email = solicitud.POST['email']
    observacion = solicitud.POST['observacion']
    codeudor = solicitud.POST['codeudor']
    codeudor_telefono = solicitud.POST['codeudor-telefono']
    codeudor_celular = solicitud.POST['codeudor-celular']
    codeudor_email = solicitud.POST['codeudor-email']

    if id_estudiante == "":
        id_estudiante = 0
        estudiante = Estudiante(configuracion_id=config_id, nombre1=nombre1, nombre2=nombre2, apellido1=apellido1, apellido2=apellido2,
                                identificacion=identificacion, tipo_documento_id=tipo_documento, direccion=direccion,
                                telefono=telefono, celular=celular, email=email, observacion=observacion,
                                codeudor=codeudor, codeudor_telefono=codeudor_telefono, codeudor_celular=codeudor_celular,
                                codeudor_email=codeudor_email)
        
    else:
        estudiante = Estudiante.objects.get(id=id_estudiante)
        estudiante.nombre1 = nombre1
        estudiante.nombre2 = nombre2
        estudiante.apellido1 = apellido1
        estudiante.apellido2 = apellido2
        estudiante.identificacion = identificacion
        estudiante.tipo_documento_id = tipo_documento
        estudiante.direccion = direccion
        estudiante.telefono = telefono
        estudiante.celular = celular
        estudiante.email = email
        estudiante.observacion = observacion
        estudiante.codeudor = codeudor
        estudiante.codeudor_telefono = codeudor_telefono
        estudiante.codeudor_celular = codeudor_celular
        estudiante.codeudor_email = codeudor_email
    
        
    estudiante.save()
    id_estudiante = estudiante.id
    datos = estudiantes(solicitud, id_estudiante)
    return redireccionar('cartera/estudiantes.html', solicitud, datos)

@login_required
def estudiantesRecordarMail(solicitud):
    if solicitud.method == 'POST':
        c = {}
        texto = "en Estudiantes Recordar Mail"
        c.update(csrf(solicitud.POST.get('csrfmiddlewaretoken')))       
        matricula_id = solicitud.POST.get('matricula_id')
        config_id = solicitud.session['config_id']
        config = Configuracion.objects.get(id=config_id)
        user = User.objects.get(id = config.usuario_id)
        
        try:
            if matricula_id != "0":
                dias=config.email_moroso
                matricula = Matricula.objects.filter(id = matricula_id)
                for mat in matricula:
                    if len(mat.estudiante.email)>0:
                        cuotas = 0
                        pagado = 0
                        valor = 0
                        cuot = ""
                        pagos = Pagos.objects.filter(matricula_id = mat.id).order_by('id')
                        for pago in pagos:
                            pagado = pagado + pago.pagado
                            valor = valor + pago.valor
                            
                            if pago.pagado<pago.valor and pago.cancelada==0:
                                fecha_pago = datetime(pago.fecha.year, pago.fecha.month, pago.fecha.day)
                                fecha = fecha_pago + timedelta(days=dias)
                                hoy = datetime.today()
                                diff = hoy - fecha
                                if diff.days > 0 and valor>pagado:
                                    cuotas = cuotas + 1
                                    cuot = "%s %s %s" %(cuot, valor, pagado)           
                        if(cuotas>0 and round((valor-pagado), 1)>0):
                            texto = u" Buen dia.\n\n Le escribimos para recordarle que el crédito que actualmente tiene vigente con %s " \
                                        u" para el programa %s tiene %s cuotas en mora. Por favor comuníquese con nosotros. " \
                                        u" Si ya se encuentra a paz y salvo haga caso omiso a este mensaje. \n\n " \
                                        u"Cordialmente,\n\n Cartera %s" \
                                        %(config.institucion, mat.facultad.nombre, cuotas, config.institucion)
#                            texto = u"%s cuotas." %(cuotas)
                            asunto = u"Recordatorio credito con %s." %(config.institucion)
                            
                            send_mail(asunto, texto, config.usuario.email, [mat.estudiante.email], fail_silently=False)
                            fecha = date.today()
                            logmensajes = LogMensajes(configuracion_id=config.id, estudiante_id=mat.estudiante.id, fecha=fecha, 
                                                      tipo='1', destino=mat.estudiante.email, mensaje = texto)
                            logmensajes.save()
                            texto = "El mensaje fué enviado con éxito."
                        else:
                            texto = "El estudiante no registra mora."
                    else:
                        texto = "El estudiante no tiene un email registrado en el sistema."
        except:
            texto = "Error enviando el email."
    return HttpResponse(texto)


@login_required
def estudiantesRecordarSms(solicitud):
    if solicitud.method == 'POST':
        c = {}
        estudiante = {}
        c.update(csrf(solicitud.POST.get('csrfmiddlewaretoken')))       
        matricula_id = solicitud.POST.get('matricula_id')
        config_id = solicitud.session['config_id']
        config = Configuracion.objects.get(id=config_id)
        user = User.objects.get(id = config.usuario_id)
        
        try:
            texto = matricula_id
            if matricula_id != "0":
                matricula = Matricula.objects.filter(id = matricula_id)
                for mat in matricula:
                    estudiante = Estudiante.objects.get(id = mat.estudiante_id)
                    if estudiante.celular != "":
                        texto = u"Buen día. Le escribimos para recordarle que el crédito que actualmente tiene vigente con %s se encuentra en mora. Por favor comuníquese con nosotros." %(config.institucion)
                        texto = 'http://www.elibom.com/http/sendmessage?username=sistemas@arawak.com.co&password=4-R@Z_zh&to=57' + estudiante.celular + '&message='+texto
                        try:
#                            f = urllib2.urlopen(texto)
#                            if f.read():
#                                texto = f.read()
#                            else:
#                                texto = f.read()
                            
                            fecha = datetime.now()
                            logmensajes = LogMensajes(configuracion_id=config_id, estudiante_id=estudiante.id, fecha=fecha, tipo='1', destino=estudiante.celular)
                            logmensajes.save()
        
                            texto = "El mensaje de texto fué enviado con éxito."
                        except HTTPError, e:  
                            texto = "Ocurrió un error"  + e.reason 
                        except URLError, e:  
                            texto = "Ocurrió un error " + e.reason
                    else:
                        texto = "El estudiante no tiene un número celular en el sistema registrado en el sistema."
        except:
            texto = "Error enviando el mensaje de texto."
    return HttpResponse(texto)

            
@login_required
def buscar(solicitud):
    config_id = solicitud.session['config_id']
    
    periodos = Periodo.objects.filter(configuracion_id=config_id).order_by('-fecha_inicio')
    facultades = Facultad.objects.filter(configuracion_id=config_id)
    datos = {'Periodos': periodos, 'Facultades':facultades}  
    return redireccionar('cartera/buscar.html', solicitud, datos)


@login_required
def buscarResultados(solicitud):
    estudiantes = ""
    matriculas = {}
    if solicitud.method == 'POST':
        config_id = solicitud.session['config_id']
    
        texto = solicitud.POST.get('texto')
        periodo = solicitud.POST.get('periodo')
        facultad = solicitud.POST.get('facultad')
        semestre = solicitud.POST.get('semestre')
        estudiantes = Estudiante.objects.filter(configuracion_id=config_id)
        estudiantes = estudiantes.filter(Q(nombre1__icontains=texto) | Q(nombre2__icontains=texto ) | Q(identificacion__icontains=texto ))
        
        i=0
        filtro = False
        if facultad!="0" or periodo!="0" or semestre !="0":
            filtro = True
            
        for estudiante in estudiantes:
            matricula = Matricula.objects.filter(estudiante_id = estudiante.id)
            
            if len(matricula)>0:
                if facultad != "0":
                    matricula = matricula.filter(facultad_id = facultad)
                if periodo != "0":
                    matricula = matricula.filter(periodo_id = periodo)
                if semestre != "0":
                    matricula = matricula.filter(semestre = semestre)
                for mat in matricula:
                    matriculas[i] = {'estudiante':estudiante, 'matricula':mat}
                    i = i + 1
            else:
                if not filtro:
                    texto = "if not filtro"
                    matriculas[i] = {'estudiante':estudiante, 'matricula':{}}
                    i = i + 1
                else:
                    texto = "else filtro"
                    matriculas[i] = {'estudiante':estudiante, 'matricula':{}}
    else:
        texto = solicitud.method
    
    datos = {'texto': texto, 'estudiantes' : matriculas,
             'envia': "Edwar C."}
    return redireccionar('cartera/resultados_buscar.html', solicitud, datos)


@login_required
def buscarOK(solicitud, estudiante_id):
    datos = estudiantes(solicitud, estudiante_id)
    return redireccionar('cartera/estudiantes.html', solicitud, datos)

#    -----------------------
#    MÓDULO CONFIGURACIÓN
#    -----------------------

@login_required
def cartera(solicitud):
    config_id = solicitud.session['config_id']
    
    periodos = Periodo.objects.filter(configuracion_id=config_id).order_by('-fecha_inicio')
    facultades = Facultad.objects.filter(configuracion_id=config_id)
    datos = {'Periodos': periodos, 'Facultades':facultades}  
    return redireccionar('cartera/cartera.html', solicitud, datos)


@login_required
def carteraResultadosConsulta(solicitud):
    estudiantes = ""
    matriculas = {}
    
    if solicitud.method == 'POST':
        config_id = solicitud.session['config_id']
        configuracion = Configuracion.objects.get(id=config_id)
        dias=configuracion.email_moroso
        texto = solicitud.POST.get('texto')
        periodo = solicitud.POST.get('periodo')
        facultad = solicitud.POST.get('facultad')
        semestre = solicitud.POST.get('semestre')
        estudiantes = Estudiante.objects.filter(configuracion_id=config_id)
        estudiantes = estudiantes.filter(Q(nombre1__icontains=texto) | Q(nombre2__icontains=texto ) | Q(identificacion__icontains=texto ))
        
        i=0
        
        for estudiante in estudiantes:
            matricula = Matricula.objects.filter(estudiante_id = estudiante.id)
            
            if len(matricula)>0:
                if facultad != "0":
                    matricula = matricula.filter(facultad_id = facultad)
                if periodo != "0":
                    matricula = matricula.filter(periodo_id = periodo)
                if semestre != "0":
                    matricula = matricula.filter(semestre = semestre)
                for mat in matricula:
                    total_pagado = 0
                    pagado = 0
                    valor = 0
                    dias_mora=0
                    saldo_mora=0
                    pagos = Pagos.objects.filter(matricula_id = mat.id).order_by('id')
                    for pago in pagos:
                        pagado = pagado + pago.pagado
                        valor = valor + pago.valor
                        fecha_pago = datetime(pago.fecha.year, pago.fecha.month, pago.fecha.day)
                        fecha = fecha_pago + timedelta(days=dias)
                        hoy = datetime.today()
                        diff = hoy - fecha
                        if diff.days > 0:
                            if valor>pagado:
                                if (diff.days + dias) > dias_mora:
                                    dias_mora = diff.days + dias
                            saldo_mora=saldo_mora + (pago.valor - pago.pagado)
                        else:
                            dias_mora = dias_mora
                        total_pagado = total_pagado + pago.pagado
                    saldo = mat.valor_credito - total_pagado
                    if(saldo>0):
                        matriculas[i] = {'estudiante':estudiante, 'matricula':mat, 'pagado':total_pagado, 'saldo':saldo, 'dm':dias_mora, 'sm':saldo_mora}
                    i = i + 1
    else:
        texto = solicitud.method
    
    return matriculas


@login_required
def carteraResultados(solicitud):
    matriculas = carteraResultadosConsulta(solicitud)
    datos = {'estudiantes' : matriculas, 'envia': "Edwar C."}
    return redireccionar('cartera/resultados_cartera.html', solicitud, datos)

#    -----------------------
#    MENÚ CONTABILIDAD
#    -----------------------

@login_required
def reciboCajaBuscar(solicitud):
    datos={}
    config_id = solicitud.session['config_id']
    movimiento = Movimiento.objects.filter(configuracion_id=config_id, movimientoTipo = 1).order_by('-fecha')
    datos = {'Recibos': movimiento}  
    return redireccionar('contabilidad/recibo_caja.html', solicitud, datos)


@login_required
def reciboCajaNuevo(solicitud, recibo_id="0"):
    config_id = solicitud.session['config_id']
    session = Session.objects.get(session_key=solicitud.session.session_key)
    uid = session.get_decoded().get('_auth_user_id')
    user = User.objects.get(pk=uid)
    estudiantes = Estudiante.objects.filter(configuracion_id=config_id)
    conceptos = Concepto.objects.filter(configuracion_id=config_id)
    recibo = {}
    reciboConceptos={}
    
    if recibo_id != "0":
        recibos = Movimiento.objects.filter(configuracion_id=config_id, id = recibo_id)
        if len(recibos)>0:
            recibo = Movimiento.objects.get(configuracion_id=config_id, id = recibo_id)
            reciboConceptos = MovimientoConcepto.objects.filter(movimiento_id = recibo.id)
        texto = recibo_id
    else:
        texto = recibo_id 
    datos = {'texto':texto, 'Estudiantes':estudiantes, 'Conceptos':conceptos,
             'Recibo':recibo, 'ReciboConceptos':reciboConceptos}
#    return HttpResponse(items)
    return redireccionar('contabilidad/recibo_caja_nuevo.html', solicitud, datos)

@login_required
def reciboCajaGuardar(solicitud):
    texto = ""
    entrada_id = 0
    proveedor = 0
    
    if solicitud.method == 'POST':
        config_id = solicitud.session['config_id']
        session = Session.objects.get(session_key=solicitud.session.session_key)
        uid = session.get_decoded().get('_auth_user_id')
        user = User.objects.get(pk=uid)
        recibo_id = solicitud.POST.get('recibo-id')   
        consecutivo = solicitud.POST.get('recibo-consecutivo')
        estudiante = solicitud.POST.get('estudiante-id', "")
        tmp_fecha = solicitud.POST.get('fecha', "")
        ciudad = solicitud.POST.get('Recibo-ciudad')
        concepto = solicitud.POST.get('recibo-concepto')
        debito = solicitud.POST.get('total', "0")
        debito = debito.replace(u",", ".")
        
        if len(tmp_fecha) > 0:
            fecha = date(int(tmp_fecha[6:10]), int(tmp_fecha[3:5]), int(tmp_fecha[0:2]))
        else:
            fecha = date.today()
        
        if recibo_id != "":
            movimientos = Movimiento.objects.filter(configuracion_id = config_id, id = recibo_id)
            if len(movimientos)>0:
                movimiento = Movimiento.objects.get(configuracion_id = config_id, id = recibo_id)
                recibo_id = movimiento.id
            else:
                recibo_id = ""
        
        if recibo_id == "":
            movimiento = Movimiento(configuracion_id=config_id, estudiante_id=estudiante, fecha=fecha, ciudad=ciudad, 
                                    movimientoTipo_id=1, consecutivo=consecutivo, concepto=concepto, debito=debito)
        else:
            movimiento = Movimiento.objects.get(configuracion_id = config_id, id = recibo_id)
            movimiento.estudiante_id = estudiante
            movimiento.fecha = fecha
            movimiento.ciudad = ciudad
            movimiento.movimientoTipo_id = 1
            movimiento.consecutivo = consecutivo
            movimiento.concepto = concepto
            movimiento.debito = debito
            
        
        movimiento.save()
        movimiento_id = movimiento.id
        
        campos = solicitud.POST.get('cant_campos')

        i=0
        no_existe = 0
        while i<int(campos):
            i=i+1
            att = "hdnConceptoCodigo_%s" %(i)
            for atributo, file in solicitud.POST.iteritems():
                texto = "%s atributo: %s att: %s" %(texto, atributo, att)
                if atributo == att:
                    concepto_id = solicitud.POST.get(att)
                    att = "hdnItem_%s" %(i)
                    item_id = solicitud.POST.get(att)
                    att = "hdnValor_%s" %(i)
                    valor = solicitud.POST.get(att)
                    valor = solicitud.POST.get(att)
                    valor = valor.replace(u",", ".")
                    att = "hdnObs_%s" %(i)
                    observacion = solicitud.POST.get(att)
                    
                    
                    if item_id == "0":
                        texto = "Guardando... %s" %(observacion)
                        movimientoConcepto = MovimientoConcepto(movimiento_id = movimiento_id, concepto_id=concepto_id, 
                                                                valor=valor, observacion=observacion)
                        movimientoConcepto.save()
                                            
                else:
                    no_existe = no_existe+1
        
        
#        GUARDAR EL SUBTOTAL, IVA Y TOTAL DE FACTURA EN FUNCIÓN DE LOS ITEMS DE FACTURA
        t_total = 0
        
        texto = " CALCULANDO LA FACTURA DE COMPRA %s" %(movimiento.id)
#        recibos = movimientoConcepto.objects.filter(movimiento_id=movimiento.id)
        recibos = MovimientoConcepto.objects.filter(movimiento_id=movimiento.id)
        for recibo in recibos:
            t_total = t_total + recibo.valor
        
        movimiento.debito = t_total
        movimiento.save()
        
    else:
        texto = solicitud.method
       
#    return HttpResponse(texto)
    return HttpResponseRedirect("/contabilidad/recibo-caja/")


@login_required
def reciboCajaBorrar(solicitud):
    texto = 0
    datos = {}
    if solicitud.POST:
        texto = 0
        recibo_id = solicitud.POST.get('recibo_id', 0)
        config_id = solicitud.session['config_id']
#        try:
        recibos = Movimiento.objects.filter(configuracion_id=config_id, id=recibo_id)
        for recibo in recibos:
            conceptos = Movimiento.objects.filter(configuracion_id=config_id, movimiento_id=recibo.id)
            for concepto in conceptos:
                concepto.delete()
            recibo.delete()
            
    return HttpResponse(texto)

@login_required
def reciboCajaBorrarItem(solicitud):
    texto = 0
    if solicitud.POST:
        texto = 0
        item_id = solicitud.POST.get('item', 0)
        texto = movimientoBorrarItem(solicitud, item_id)
    return HttpResponse(texto)


def movimientoBorrarItem(solicitud, item_id):
#    config_id = solicitud.session['config_id']
    Items = MovimientoConcepto.objects.filter(id=item_id)
    if len(Items)>0:
        Item = MovimientoConcepto.objects.get(id=item_id)
        Item.delete()
        texto = 1
    else:
        texto = 2
    return HttpResponse(texto)

#    -----------------------
#    MÓDULO CONFIGURACIÓN
#    -----------------------

@login_required
def configuracion(solicitud, texto=""):
    session = Session.objects.get(session_key=solicitud.session.session_key)
    uid = session.get_decoded().get('_auth_user_id')
    
    configuracion = Configuracion.objects.filter(usuario_id=uid)
    if len(configuracion)>0:
        configuracion = Configuracion.objects.get(usuario_id=uid)
    else:
        configuracion = {}
    
    periodos = Periodo.objects.filter(configuracion_id = configuracion.id).order_by('-fecha_inicio')
    facultades = Facultad.objects.filter(configuracion_id = configuracion.id)
    conceptos = Concepto.objects.filter(configuracion_id = configuracion.id)
    notificaciones = Notificaciones.objects.filter(configuracion_id = configuracion.id).aggregate(fecha=Max('fecha'))
    if notificaciones['fecha']!=None:
        fecha_notificacion = notificaciones['fecha']
    else:
        fecha_notificacion = ""
    
    datos = {'Periodos': periodos, 'Facultades':facultades, 'Conceptos':conceptos, 'configuracion':configuracion, 
                'texto':texto, 'f_notificacion':fecha_notificacion}
    return redireccionar('configuracion.html', solicitud, datos)


@login_required
def configuracionGuardar(solicitud):
    c = {}
    texto = ""
    logo = ""
    c.update(csrf(solicitud.POST.get('csrfmiddlewaretoken')))
    config_id = solicitud.session['config_id']
    
    session = Session.objects.get(session_key=solicitud.session.session_key)
    uid = session.get_decoded().get('_auth_user_id')
    user = User.objects.get(pk=uid)
    try:
        institucion = solicitud.POST.get('institucion')
    
        for filename, file in solicitud.FILES.iteritems():
            logo = solicitud.FILES[filename].name
            logo = solicitud.FILES['foto']
    
        recordatorio_sms = solicitud.POST.get('dias-sms')
        recordatorio_email = solicitud.POST.get('dias-email')
        sms_moroso = solicitud.POST.get('morosos-sms')
        email_moroso = solicitud.POST.get('morosos-email')
        tasa_interes = solicitud.POST.get('tasa-interes', '')
        email = solicitud.POST.get('email', '')
        contrasena_actual = solicitud.POST.get('contrasena-actual')
        contrasena_nueva = solicitud.POST.get('contrasena-nueva')
        
        tasa_interes = tasa_interes.replace(u",", ".")
        
        config = Configuracion.objects.filter(id=config_id)
        if len(config)>0:
            config = Configuracion.objects.get(id=config_id)
            config.institucion = institucion
            config.logo = logo
            config.recordatorio_sms = recordatorio_sms
            config.recordatorio_email = recordatorio_email
            config.sms_moroso = sms_moroso
            config.email_moroso = email_moroso
            config.tasa_interes = tasa_interes
            
            if email.strip() != "":
                user.email = email
                if contrasena_actual.strip() != "":
                    tmp_user = authenticate(username=user.username, password=contrasena_actual)
                    if tmp_user is not None:
                        texto = "Contraseña actualizada."
                        user.set_password(contrasena_nueva)
                    else:
                        texto = "La contraseña no ha sido modificada. La contraseña actual no coincide."
                user.save()
            config.save()
        else:
            config = Configuracion(usuario_id = user.id, institucion=institucion, logo=logo, recordatorio_sms=recordatorio_sms,
                                          recordatorio_email=recordatorio_email, sms_moroso=sms_moroso,
                                          email_moroso=email_moroso, tasa_interes=tasa_interes)
            config.save()
        texto = logo     
    
    except:
            texto = "Error"
    return configuracion(solicitud, texto)

@login_required
def configuracionPeriodos(solicitud):
    if solicitud.method == 'POST':
        config_id = solicitud.session['config_id']
           
        nombre_periodo = solicitud.POST.get('periodo-nombre')
        
        tmp_inicio = solicitud.POST.get('periodo-inicio')
        if tmp_inicio != '':
            inicio = date(int(tmp_inicio[6:10]), int(tmp_inicio[0:2]), int(tmp_inicio[3:5]))
        else:
            inicio = date.today()
        
        
        tmp_fin = solicitud.POST.get('periodo-fin')
        if tmp_fin != '':
            fin = date(int(tmp_fin[6:10]), int(tmp_fin[0:2]), int(tmp_fin[3:5]))
        else:
            fin = date.today()
        
        corte = solicitud.POST.get('chk-fin-mes', 0)
        if corte != 0:
            corte = 1
        if corte==1:
            if int(tmp_fin[0:2]) > int(tmp_inicio[0:2]):
                meses = int(tmp_fin[0:2]) - int(tmp_inicio[0:2]) + 1
            else: meses = 0
        else:
            meses = solicitud.POST.get('periodo-cuotas',0)
        periodo = Periodo(configuracion_id = config_id, nombre=nombre_periodo, fecha_inicio=inicio, fecha_fin=fin, corte_fin_mes=corte, meses=meses)
        periodo.save()
        texto = corte
    else:
        texto = solicitud.method
    
    return configuracion(solicitud, texto)


@login_required
def configuracionPeriodosBorrar(solicitud):
    if solicitud.POST:
        texto = ""
        config_id = solicitud.session['config_id']
        
        try:
            periodos = Periodo.objects.filter(configuracion_id=config_id)
            for periodo in periodos:
                chk = u"%s_%s" %('chk', periodo.id)
                periodo_seleccionado = solicitud.POST.get(chk, 0)
                if periodo_seleccionado != 0:
                    mat = Matricula.objects.filter(periodo_id=periodo.id)
                    if len(mat)<1:
                        tmp_periodo = Periodo.objects.get(id = periodo.id)
                        tmp_periodo.delete()
        except:
            texto = "Error"
    return configuracion(solicitud, texto)


@login_required
def configuracionFacultades(solicitud):
    if solicitud.method == 'POST':
        config_id = solicitud.session['config_id']
    
        c = {}
        c.update(csrf(solicitud.POST.get('csrfmiddlewaretoken')))       
        sigla = solicitud.POST.get('facultad-sigla')
        nombre = solicitud.POST.get('facultad-nombre')
        semestres = solicitud.POST.get('facultad-semestres')
        facultad = Facultad(configuracion_id=config_id, sigla=sigla, nombre=nombre, semestres=semestres)
        facultad.save()
    
    return configuracion(solicitud, "")


@login_required
def configuracionFacultadesBorrar(solicitud):
    if solicitud.POST:
        texto = ""
        config_id = solicitud.session['config_id']
        
        try:
            facultades = Facultad.objects.filter(configuracion_id=config_id)
            for facultad in facultades:
                chk = u"%s_%s" %('chk', facultad.id)
                facultad_seleccionada = solicitud.POST.get(chk, 0)
                if facultad_seleccionada != 0:
                    mat = Matricula.objects.filter(facultad_id=facultad.id)
                    if len(mat)<1:
                        tmp_facultad = Facultad.objects.get(id = facultad.id)
                        tmp_facultad.delete()
        except:
            texto = "Error"
    return configuracion(solicitud, texto)


@login_required
def configuracionConceptos(solicitud):
    if solicitud.method == 'POST':
        config_id = solicitud.session['config_id']
    
        c = {}
        c.update(csrf(solicitud.POST.get('csrfmiddlewaretoken')))       
        codigo = solicitud.POST.get('concepto-codigo')
        nombre = solicitud.POST.get('concepto-nombre')
        concepto = Concepto(configuracion_id=config_id, codigo=codigo, nombre=nombre)
        concepto.save()
    
    return configuracion(solicitud, "")


@login_required
def configuracionConceptosBorrar(solicitud):
    if solicitud.POST:
        texto = ""
        config_id = solicitud.session['config_id']
        
        try:
            conceptos = Concepto.objects.filter(configuracion_id=config_id)
            for concepto in conceptos:
                chk = u"%s_%s" %('chk', concepto.id)
                concepto_seleccionado = solicitud.POST.get(chk, 0)
                if concepto_seleccionado != 0:
                    con = MovimientoConcepto.objects.filter(concepto_id=concepto.id)
                    if len(con)<1:
                        tmp_concepto = Concepto.objects.get(id = concepto.id)
                        tmp_concepto.delete()
        except:
            texto = "Error"
    return configuracion(solicitud, texto)


@login_required
def configuracionNotificacionMora(solicitud):
    texto = ""
    if solicitud.POST:
#        c = {}
#        c.update(csrf(solicitud.POST.get('csrfmiddlewaretoken'))) 
        try:
            config_id = solicitud.session['config_id']
            call_command('notificacion', config_id)
            texto = "El comando notificación se ejecutó con éxito."
        except:
            texto = "Error ejecutando el comando notificacion."
    return HttpResponse(texto)


@login_required
def carteraExportar(solicitud):
    # Create the HttpResponse object with the appropriate CSV header.
    response = HttpResponse(mimetype='text/csv')
    response['Content-Type'] = 'text/csv; charset=utf-8'
    response['Content-Disposition'] = 'attachment; filename=cartera.csv'
    response['charset'] = 'UTF-8'
    
    writer = csv.writer(response)
    writer.writerow(["DOCUMENTO", "NOMBRE","PERIODO", "FACULTAD", "SEMESTRE",  
                         "VALOR_CREDITO", "SALDO", "DM", "SM"])
    
    datos = carteraResultadosConsulta(solicitud)
    
    llaves = datos.keys()
    for indice in range(0,len(llaves)):
        writer.writerow([datos[llaves[indice]]["estudiante"].identificacion, datos[llaves[indice]]["estudiante"],
                         datos[llaves[indice]]["matricula"].periodo, datos[llaves[indice]]["matricula"].facultad, 
                         datos[llaves[indice]]["matricula"].semestre, datos[llaves[indice]]["matricula"].valor_credito, 
                         datos[llaves[indice]]["saldo"], "", ""])
    
    return response


@login_required
def carteraReporte(solicitud):
    matriculas = carteraResultadosConsulta(solicitud)
    config_id = solicitud.session['config_id']
    configuracion = Configuracion.objects.get(id=config_id)
    datos = {'estudiantes' : matriculas, 'configuracion': configuracion}
    return redireccionar('cartera/reporte_cartera.html', solicitud, datos)